package com.itheima.d1_collection;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 并发修改异常
 */
public class CollectionTravelDemo6 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java入门");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("枸杞子");
        list.add("西洋参");
        System.out.println(list);
        //使用for循环删除
//        for (int i = 0; i < list.size(); i++) {
//            String s = list.get(i);
//            if (s.contains("枸杞")) {
//                list.remove(s);
//            }
//        }
//        System.out.println( list);
        //删除不干净 两种方式 1是倒序遍历 2是每删除一个元素，索引向前移一位 i--
        System.out.println("-------------------------");


        //第二种解决方案： 使用迭代器遍历 并且要用迭代器的remove()方法
        //迭代器和集合操作元素互斥 不能结合着使用
//        Iterator<String> it = list.iterator();
//        while(it.hasNext()){
//            String s = it.next();
//            if(s.contains("枸杞")){
//                it.remove();//注意 使用迭代器 必须用迭代器的方式删除 不能用集合的方法 否则会报并发修改异常
//            }
//        }
//        System.out.println(list);

        //第三种解决方案：使用增强for循环遍历
        for (String s : list) {
            if(s.contains("枸杞")){
                list.remove(s);//因为增强for循环的底层原理还是用的迭代器的方式删除 所以不能用集合的方式删除
            }
        }
        //由此可见 for循环和foreach()方法（lambda表达式）底层原理都是用迭代器 所以不能用集合的方式删除
        //所以不能用for循环和foreach()方法 进行遍历删除
    }
}
